www.gusucode.com > vc++ 远程控制示例源程序-源码程序 > vc++ 远程控制示例源程序-源码程序\code\PeerYouC\PeerRegeditTreeView.cpp

    //Download by http://www.NewXing.com
// PeerRegeditTreeView.cpp : implementation file
//

#include "stdafx.h"
#include "PeerYouC.h"
#include "PeerRegeditTreeView.h"
#include "peerregeditlistview.h"
#include "peermessagelistview.h"
#include "regeditaddkeydlg.h"
#include "MainFrm.h"
#include "command.h"
#include "peersocket.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPeerRegeditTreeView

IMPLEMENT_DYNCREATE(CPeerRegeditTreeView, CTreeView)

CPeerRegeditTreeView::CPeerRegeditTreeView()
{
}

CPeerRegeditTreeView::~CPeerRegeditTreeView()
{
}


BEGIN_MESSAGE_MAP(CPeerRegeditTreeView, CTreeView)
	//{{AFX_MSG_MAP(CPeerRegeditTreeView)
	ON_WM_CREATE()
	ON_WM_LBUTTONDOWN()
	ON_NOTIFY_REFLECT(NM_RCLICK, OnRclick)
	ON_COMMAND(ID_REGEDIT_KEY_ADD, OnRegeditKeyAdd)
	ON_COMMAND(ID_REGEDIT_KEY_DEL, OnRegeditKeyDel)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPeerRegeditTreeView drawing

void CPeerRegeditTreeView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CPeerRegeditTreeView diagnostics

#ifdef _DEBUG
void CPeerRegeditTreeView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CPeerRegeditTreeView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CPeerRegeditTreeView message handlers

int CPeerRegeditTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CTreeView::OnCreate(lpCreateStruct) == -1)
		return -1;
	// TODO: Add your specialized creation code here
	CTreeCtrl& tree=GetTreeCtrl();
	tree.ModifyStyle(0,TVS_HASLINES|TVS_LINESATROOT|TVS_SHOWSELALWAYS|
		TVS_HASBUTTONS);
	if(!m_imagelist.Create( 16,16,ILC_MASK,3,1))
		return -1;
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_REGCOMPUTER));
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_REGDIRCLOSE));	
	m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_REGDIROPEN));
	tree.SetImageList(&m_imagelist,TVSIL_NORMAL);
	return 0;
}

void CPeerRegeditTreeView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CTreeView::OnLButtonDown(nFlags, point);
	CTreeCtrl& tree=GetTreeCtrl();
	HTREEITEM item,root;
	UINT flag=TVHT_ONITEM|TVHT_ONITEMBUTTON ;
	if(!(item=tree.HitTest(point,&flag)))
		return;
	if(!(root=tree.GetRootItem()))
	{
		return;
	}
	if(item!=root)
	{
		char masterkey[32];
		char childkey[512];
		WSAEVENT hevent=WSACreateEvent();
		if(!hevent)
		{
			return;
		}
		SOCKET s;
		COMMAND com;
		REGEDIT reg;
		DWORD ret;
		if(!PeerCreateSocket(&s,PEER_STREAM))
		{
			return;
		}
		AfxGetApp()->DoWaitCursor(1);
		CSplitterWnd* regsplitterwnd=(CSplitterWnd*)GetParent();
		CPeerRegeditListView* listview=(CPeerRegeditListView*)regsplitterwnd->GetPane(0,1);
		CListCtrl& list=listview->GetListCtrl();
		if(flag&TVHT_ONITEM)
		{
			list.DeleteAllItems();
			if(PeerConnectSocket(s,ADDRESS,7788))
			{
				memset(&com,0,sizeof(com));
				com.CommandID=PEER_REGEDIT_ENUMVALUE;
				com.DataSize=sizeof(reg);
				memset(&reg,0,sizeof(reg));
				MakeRegInfo(tree,item,reg);
				if(strcmp(reg.sunkey,"SECURITY")==0)
				{
					WSACloseEvent(hevent);
					closesocket(s);
					AfxGetApp()->DoWaitCursor(0);
					return;
				}

				strcpy(masterkey,reg.key);
				strcpy(childkey,reg.sunkey);
				LVITEM litem;
				char regtype[100];
				char regvalue[512];
				if(PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hevent))
				{
					WSAResetEvent(hevent);
					if(!PeerSendDataS(s,(char*)&reg,sizeof(reg),&ret,hevent))
					{
						WSACloseEvent(hevent);
						closesocket(s);
						AfxGetApp()->DoWaitCursor(0);
						MESS(masterkey,childkey,"失败",0);
						return;
					}
					while(PeerRecvDataS(s,(char*)&reg,sizeof(reg),&ret,hevent)&&ret==sizeof(reg))
					{
						WSAResetEvent(hevent);
						int index=list.GetItemCount();
						litem.cchTextMax=512;
						int image;
						if(reg.type==REG_BINARY||
							reg.type==REG_DWORD||
							reg.type==REG_RESOURCE_LIST||
							reg.type==REG_LINK||
							reg.type==REG_DWORD_BIG_ENDIAN||
							reg.type==REG_FULL_RESOURCE_DESCRIPTOR
							)
						{
							image=1;
						}
						else if(reg.type==REG_SZ||
							reg.type==REG_EXPAND_SZ||
							reg.type==REG_NONE||
							REG_MULTI_SZ)
						{
							image=0;
						}
						else
							image=3;
						list.InsertItem(index,reg.value,image);
						litem.mask=TVIF_TEXT|TVIF_IMAGE ;
						litem.iItem=index;
						litem.iSubItem=1;
						litem.cchTextMax=512;
						GetType(reg.type,regtype);
						litem.pszText=regtype;
						list.SetItem(&litem);
						litem.iSubItem=2;
						regvalue[0]=0;
						if(reg.datalen>0)
							memcpy((char*)regvalue,(char*)reg.data,reg.datalen);
						SetType(reg.type,regvalue,reg.datalen);
						litem.pszText=regvalue;
						list.SetItem(&litem);
					}
				}
				MESS(masterkey,childkey,"成功",0);
			}
		}
		if(flag&TVHT_ONITEMBUTTON)
		{
			if(tree.GetItemState(item,TVIS_EXPANDED)&TVIS_EXPANDEDONCE)
				return;
			HTREEITEM delitem;
			while((delitem=tree.GetChildItem(item)))
			{
				tree.DeleteItem(delitem);
			}
			if(PeerConnectSocket(s,ADDRESS,7788))
			{
				memset(&com,0,sizeof(com));
				com.CommandID=PEER_REGEDIT_ENUMKEY;
				com.DataSize=sizeof(reg);
				memset(&reg,0,sizeof(reg));
				MakeRegInfo(tree,item,reg);
				if(strcmp(reg.sunkey,"SECURITY")==0)
				{
					WSACloseEvent(hevent);
					closesocket(s);
					AfxGetApp()->DoWaitCursor(0);
					return;
				}
				strcpy(masterkey,reg.key);
				strcpy(childkey,reg.sunkey);
				if(PeerSendDataS(s,(char*)&com,sizeof(com),&ret,hevent))
				{
					WSAResetEvent(hevent);
					if(!PeerSendDataS(s,(char*)&reg,sizeof(reg),&ret,hevent)||ret!=sizeof(reg))
					{
						WSACloseEvent(hevent);
						closesocket(s);
						AfxGetApp()->DoWaitCursor(0);
						MESS(masterkey,childkey,"失败",0);
						return;
					}
					HTREEITEM insertitem;
					while(PeerRecvDataS(s,(char*)&reg,sizeof(reg),&ret,hevent)&&ret==sizeof(reg))
					{
						WSAResetEvent(hevent);
						insertitem=tree.InsertItem(reg.sunkey,1,2,item);
						if(reg.havechild==1)
						{
							TVITEM	childflag;
							childflag.mask=TVIF_CHILDREN ;
							childflag.cChildren=1;
							childflag.hItem=insertitem;
							tree.SetItem(&childflag);
						}
					}
					tree.SortChildren(item);
					tree.Expand(item,TVE_EXPAND);
				}
				MESS(masterkey,childkey,"成功",1);
			}
		}
		AfxGetApp()->DoWaitCursor(0);
		WSACloseEvent(hevent);
		closesocket(s);
	}
}
void CPeerRegeditTreeView::SetType(DWORD type, char *strType,DWORD len)
{
	switch(type)
	{
		case REG_BINARY:
		case REG_RESOURCE_LIST:
		case REG_FULL_RESOURCE_DESCRIPTOR:
		case REG_LINK:
			char tmp[512];
			char ch[3];
			DWORD i;
			tmp[0]=0;
			if(len>170)
				len=170;
			for(i=0;i<len;i++)
			{
				BYTE ch1,ch2;
				ch1=(BYTE)(strType[i])>>4;
				ch2=(BYTE)(strType[i])&0x0f;
				sprintf(ch,"%x%x ",ch1,ch2);
				strcat(tmp,ch);
			}
			strcpy(strType,tmp);
			break;
		case REG_DWORD:
		case REG_DWORD_BIG_ENDIAN:
			DWORD word;
			word=*(DWORD*)strType;
			sprintf(strType,"0x%x(%u)",word,word);
			break;
		case REG_SZ:
		case REG_EXPAND_SZ:
		case REG_MULTI_SZ:
		case REG_NONE:
			break;
		default:
			strcpy(strType,"不能识别");
			break;
	}
}
void CPeerRegeditTreeView::GetType(DWORD type, char *strType)
{
	switch(type)
	{
		case REG_BINARY:
			strcpy(strType,"REG_BINARY");
			break;
		case REG_DWORD:
			strcpy(strType,"REG_DWORD");
			break;
		case REG_DWORD_BIG_ENDIAN:
			strcpy(strType,"REG_DWORD_BIG_ENDIAN");
			break;
		case REG_SZ:
			strcpy(strType,"REG_SZ");
			break;
		case REG_EXPAND_SZ:
			strcpy(strType,"REG_EXPAND_SZ");
			break;
		case REG_MULTI_SZ:
			strcpy(strType,"REG_MULTI_SZ");
			break;
		case REG_RESOURCE_LIST:
			strcpy(strType,"REG_RESOURCE_LIST");
			break;
		case REG_NONE:
			strcpy(strType,"REG_NONE");
			break;
		case REG_LINK:
			strcpy(strType,"REG_LINK");
			break;
		case REG_FULL_RESOURCE_DESCRIPTOR:
			strcpy(strType,"REG_FULL_RESOURCE_DESCRIPTOR");
			break;
		default:
			strcpy(strType,"不能识别");
			break;
	}

}

void CPeerRegeditTreeView::MakeRegInfo(CTreeCtrl& tree,HTREEITEM item,REGEDIT &reg)
{
	HTREEITEM parent;
	char value[512],tmp[512];
	value[0]=0;tmp[0]=0;
	strcpy(value,tree.GetItemText(item));
	if(strcmp(value,"HKEY_CLASSES_ROOT")==0||
			strcmp(value,"HKEY_CURRENT_USER")==0||
			strcmp(value,"HKEY_LOCAL_MACHINE")==0||
			strcmp(value,"HKEY_USERS")==0||
			strcmp(value,"HKEY_CURRENT_CONFIG")==0)
		{
			strcpy(reg.key,value);
			reg.sunkey[0]=0;
			return;
		}
	parent=item;
	while((parent=tree.GetParentItem(parent)))
	{
		strcpy(tmp,tree.GetItemText(parent));
		if(strcmp(tmp,"HKEY_CLASSES_ROOT")==0||
			strcmp(tmp,"HKEY_CURRENT_USER")==0||
			strcmp(tmp,"HKEY_LOCAL_MACHINE")==0||
			strcmp(tmp,"HKEY_USERS")==0||
			strcmp(tmp,"HKEY_CURRENT_CONFIG")==0)
		{
			strcpy(reg.key,tmp);
			strcpy(reg.sunkey,value);
			return;
		}
		else
		{
			strcat(tmp,"\\");
			strcat(tmp,value);
			strcpy(value,tmp);
		}
	}
}

void CPeerRegeditTreeView::OnRclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	CPoint point;
	::GetCursorPos(&point);
	ScreenToClient(&point);
	CTreeCtrl& tree=GetTreeCtrl();
	HTREEITEM item,root;
	UINT flag=TVHT_ONITEM|TVHT_ONITEMBUTTON ;
	if(!(item=tree.HitTest(point,&flag)))
		return;
	if(!(root=tree.GetRootItem()))
	{
		return;
	}
	if(item!=root)
	{
		tree.SelectItem(item);
		ClientToScreen(&point);
		CMenu menu;
		VERIFY(menu.LoadMenu(IDR_REGEDIT_TREE));
		CMenu* pPopup = menu.GetSubMenu(0);
		ASSERT(pPopup != NULL);
		CWnd* pWndPopupOwner = this;

		while (pWndPopupOwner->GetStyle() & WS_CHILD)
			pWndPopupOwner = pWndPopupOwner->GetParent();

		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
			pWndPopupOwner);
	}
	*pResult = 0;
}

void CPeerRegeditTreeView::OnRegeditKeyAdd() 
{
	// TODO: Add your command handler code here
	CTreeCtrl& tree=GetTreeCtrl();
	HTREEITEM item;
	if(!(item=tree.GetSelectedItem())||item==tree.GetRootItem())
		return;
	REGEDIT reg;
	MakeRegInfo(tree,item,reg);
	CRegeditAddKeyDlg dlg;

	if(dlg.DoModal()==IDOK)
	{
		strcat(reg.sunkey,"\\");
		strcat(reg.sunkey,dlg.m_key);
		HTREEITEM hSearch;
		if((hSearch=tree.GetChildItem(item)))
		{
			if(strcmp(tree.GetItemText(hSearch),dlg.m_key)==0)
			{
				MessageBox("已经有此键了,选择另外一个","窥视-客户端",MB_ICONWARNING|MB_OK);
				return;
			}
			else
			{
				HTREEITEM hChild;
				while((hChild=tree.GetNextItem(hSearch,TVGN_NEXT)))
				{
					if(strcmp(tree.GetItemText(hChild),dlg.m_key)==0)
					{
						MessageBox("已经有此键了,选择另外一个","窥视-客户端",MB_ICONWARNING|MB_OK);
						return;
					}
					hSearch=hChild;
				}
			}
			
		}

		SOCKET s;
		DWORD ret;
		
		char meskey[32];
		char messunkey[512];
		strcpy(meskey,reg.key);
		strcpy(messunkey,reg.sunkey);
		if(!PeerCreateSocket(&s,PEER_STREAM))
		{
			return;
		}
		WSAEVENT hevent=WSACreateEvent();
		if(PeerConnectSocket(s,ADDRESS,7788))
		{
			COMMAND cmd;
			memset(&cmd,0,sizeof(cmd));
			cmd.CommandID=PEER_REGEDIT_CREATEKEY;
			if(!PeerSendDataS(s,(char*)&cmd,sizeof(cmd),&ret,hevent))
			{
				RegMess(meskey,messunkey,0,"失败");
				goto MYERROR ;
			}
			if(!PeerSendDataS(s,(char*)&reg,sizeof(reg),&ret,hevent))
			{
				RegMess(meskey,messunkey,1,"失败");
				goto MYERROR ;
			}
			else
			{
				COMMAND cmd;
				if(!PeerRecvDataS(s,(char*)&cmd,sizeof(cmd),&ret,hevent)||ret!=sizeof(cmd))
				{
					RegMess(meskey,messunkey,1,"失败");
					goto MYERROR ;
				}
				tree.InsertItem(dlg.m_key,1,2,item);
	
				TVITEM tvitem;
				tvitem.mask=TVIF_CHILDREN;
				tvitem.hItem=item;
				tvitem.cChildren=1;
				tree.SetItem(&tvitem);
				tree.Expand(item,TVE_EXPAND);
				tree.SortChildren(item);
			}
		}

		RegMess(meskey,messunkey,1,"成功");
MYERROR:
		PeerCloseSocket(s);
		WSACloseEvent(hevent);
	}
}

void CPeerRegeditTreeView::OnRegeditKeyDel() 
{
	// TODO: Add your command handler code here
	CTreeCtrl& tree=GetTreeCtrl();
	HTREEITEM item;
	if(!(item=tree.GetSelectedItem())||item==tree.GetRootItem())
		return;
	REGEDIT reg;
	MakeRegInfo(tree,item,reg);
	if(strlen(reg.sunkey)==0)
	{
		MessageBox("你不能删除五个主键!!!","窥视-客户端",MB_ICONSTOP|MB_OK);
		return;
	}
	if(MessageBox("确定删除吗?","窥视-客户端",MB_ICONWARNING|MB_OKCANCEL)!=1)
		return;
	SOCKET s;
	DWORD ret;
	char meskey[32];
	char messunkey[512];
	strcpy(meskey,reg.key);
	strcpy(messunkey,reg.sunkey);
	if(!PeerCreateSocket(&s,PEER_STREAM))
	{
		return;
	}
	WSAEVENT hevent=WSACreateEvent();
	if(PeerConnectSocket(s,ADDRESS,7788))
	{
		COMMAND cmd;
		memset(&cmd,0,sizeof(cmd));
		cmd.CommandID=PEER_REGEDIT_DELETEKEY;
		if(!PeerSendDataS(s,(char*)&cmd,sizeof(cmd),&ret,hevent))
		{
			RegMess(meskey,messunkey,0,"失败");
			goto MYERROR ;
		}
		if(!PeerSendDataS(s,(char*)&reg,sizeof(reg),&ret,hevent))
		{
			RegMess(meskey,messunkey,0,"失败");
			goto MYERROR ;
		}
		else
		{
			
			if(!PeerRecvDataS(s,(char*)&cmd,sizeof(cmd),&ret,hevent)||ret!=sizeof(cmd))
			{
				RegMess(meskey,messunkey,0,"失败");
				goto MYERROR ;
			}
			HTREEITEM parentitem;
			parentitem=tree.GetParentItem(item);
			tree.DeleteItem(item);
			if(parentitem&&!tree.GetChildItem(parentitem))
			{
				TVITEM parent;
				parent.mask=TVIF_CHILDREN;
				parent.hItem=parentitem;
				parent.cChildren=0;
				tree.SetItem(&parent);
			}

		}
	}
	RegMess(meskey,messunkey,0,"成功");
MYERROR:
	PeerCloseSocket(s);
	WSACloseEvent(hevent);
}

void CPeerRegeditTreeView::RegMess(char *key, char *sunkey, int flag,char* stat)
{
	CMainFrame* pMainWnd=(CMainFrame*)AfxGetApp()->GetMainWnd();
	CListCtrl& mess=pMainWnd->m_pListMessage->GetListCtrl();
	CString a;
	if(flag)
		a="添加键:\" ";
	else
		a="删除键:\" ";
	CTime t = CTime::GetCurrentTime();
	int messcount=mess.GetItemCount();
	if(messcount>200)
		mess.DeleteAllItems();
	int insertindex;
	insertindex=mess.InsertItem(0,stat);
	a+=key;a+="\\";a+=sunkey;a+="\"";
	mess.SetItem(insertindex,1,LVIF_TEXT,a,0,0,0,NULL);
	mess.SetItem(insertindex,2,LVIF_TEXT,ADDRESS,0,0,0,NULL);
	a=t.Format("%Y-%m-%d %H:%M:%S");
	mess.SetItem(insertindex,3,LVIF_TEXT,a,0,0,0,NULL);
}
void CPeerRegeditTreeView::MESS(char* key,char* childkey, char *ifok,bool flag)
{
	CMainFrame* pMainWnd=(CMainFrame*)AfxGetApp()->GetMainWnd();
	CListCtrl& mess=pMainWnd->m_pListMessage->GetListCtrl();
	int messcount=mess.GetItemCount();
	if(messcount>200)
		mess.DeleteAllItems();
	else
	{
		CString a="枚举注册表键: \"";
		a+=key;
		if(strlen(childkey)!=0)
		{
		a+="\\";a+=childkey;
		}
		a+="\"";
		if(flag)
			a+=" 的所有子键";
		else
			a+=" 的所有值";
		int insertindex;
		insertindex=mess.InsertItem(0,ifok);
		mess.SetItem(insertindex,1,LVIF_TEXT,a,0,0,0,NULL);
		mess.SetItem(insertindex,2,LVIF_TEXT,ADDRESS,0,0,0,NULL);
		CTime t = CTime::GetCurrentTime();
		a=t.Format("%Y-%m-%d %H:%M:%S");
		mess.SetItem(insertindex,3,LVIF_TEXT,a,0,0,0,NULL);
	}

}